home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / ForCLI / 0Utils13.lha / 0Utils / Exists.c < prev    next >
C/C++ Source or Header  |  1995-03-20  |  4KB  |  195 lines

  1.  
  2. /******************************************************************************
  3.  
  4.     MODULE
  5.     Exists.c
  6.  
  7.     DESCRIPTION
  8.     Get one filename on Commandline
  9.     and write to StdOut if it exists
  10.  
  11.     NOTES
  12.     Kickstart 2.0+ required
  13.     compiles w/ SAS/C v6.51
  14.  
  15.     BUGS
  16.     We use 'Lock', so Exists fails, if the
  17.     file exists and is exclusively locked
  18.  
  19.     TODO
  20.     Use another way than 'Lock' to determine
  21.     the existance
  22.  
  23.     EXAMPLES
  24.     > Exists Sys:System/CLI
  25.     1
  26.  
  27.     SEE ALSO
  28.  
  29.     INDEX
  30.  
  31.     HISTORY
  32.     20-03-94 b_noll created
  33.     03-02-95 b_noll created (had forgotten the first version =8-})
  34.     11-02-95 b_noll added FULL Keyword
  35.     20-02-95 b_noll restructured source
  36.     21-02-95 b_noll added version/format-prefix/offset
  37.     20-03-95 b_noll added args diagnostics
  38.  
  39.     AUTHOR
  40.     Bernd Noll, Brunnenstrasse 55, D-67661 Kaiserslautern
  41.     b_noll@informatik.uni-kl.de
  42.  
  43. ******************************************************************************/
  44.  
  45. /**************************************
  46.         Includes
  47. **************************************/
  48.  
  49. #ifndef   EXEC_LIBRARIES_H
  50. # include <exec/libraries.h>
  51. #endif /* EXEC_LIBRARIES_H */
  52.  
  53. #ifndef   CLIB_EXEC_PROTOS_H
  54. # include <clib/exec_protos.h>
  55. #endif /* CLIB_EXEC_PROTOS_H */
  56.  
  57. #ifndef   DOS_DOS_H
  58. # include <dos/dos.h>
  59. #endif /* DOS_DOS_H */
  60.  
  61. #ifndef   CLIB_DOS_PROTOS_H
  62. # include <clib/dos_protos.h>
  63. #endif /* CLIB_DOS_PROTOS_H */
  64.  
  65. #include <proto/dos.h>
  66. #include <proto/exec.h>
  67.  
  68.  
  69. /**************************************
  70.      Defines & Structures
  71. **************************************/
  72.  
  73. #ifndef ABSEXECBASE
  74. #define ABSEXECBASE ((struct ExecBase **)4L)
  75. #endif
  76.  
  77. struct _arg {
  78. /* ******************** USER FORMAT ******************** */
  79. #define FORMAT "FILE/A,NAME/S,FULL/S"
  80.  
  81.     STRPTR file;
  82.     ULONG  name;
  83.     ULONG  full;
  84.  
  85. /* ******************** USER FORMAT ******************** */
  86. }; /* struct _argv */
  87.  
  88. #define MAXPATHLEN 256
  89. #define MAXLINELEN 256
  90.  
  91. #define VERSIONPREFIX    "\0$VER: "
  92. #define VERSIONOFFSET    0
  93. #define FORMATPREFIX    "\0$ARG: "
  94. #define FORMATOFFSET    7
  95.  
  96. /**************************************
  97.         Implementation
  98. **************************************/
  99.  
  100. long _main (void)
  101. {
  102.     const char* version = VERSIONPREFIX "Exists 1.3 " __AMIGADATE__ + VERSIONOFFSET;
  103.     long retval = RETURN_FAIL;
  104.     struct ExecBase*SysBase = *ABSEXECBASE;
  105.     struct Library* DOSBase;
  106.  
  107.     if (DOSBase = OpenLibrary (DOSNAME, 37)) {
  108.     struct _arg argv = { 0 };
  109.     APTR   args;
  110.     retval     = RETURN_ERROR;
  111.     if (args = (void*)ReadArgs(FORMATPREFIX FORMAT + FORMATOFFSET, (LONG*)&argv, NULL)) {
  112. /* ******************** USER BODY ******************** */
  113.  
  114.         APTR pw;
  115.         struct Process *p;
  116.         STRPTR ostr;
  117.         BPTR lock;
  118.  
  119.         if ((p = (struct Process *)FindTask(NULL))) {
  120.         pw = p->pr_WindowPtr;
  121.         p->pr_WindowPtr = (APTR)-1;
  122.         } /* if */
  123.  
  124.         /* ---- Existance check: rv==0->Exists, rv==5->n/e */
  125.         retval = RETURN_WARN;
  126.         {
  127. #if 1
  128.         UBYTE buffer[MAXPATHLEN];
  129.  
  130.         if ((lock = Lock(argv.file, ACCESS_READ))) {
  131.             retval = RETURN_OK;
  132.  
  133.             if (argv.full) {
  134.             NameFromLock(lock, buffer, sizeof(buffer));
  135.             ostr = buffer;
  136.             } else if (argv.name) {
  137.             ostr = argv.file;
  138.             } else {
  139.             ostr = "1";
  140.             } /* if */
  141.  
  142.             UnLock (lock);
  143.         } else if (IoErr() == ERROR_OBJECT_IN_USE) {
  144.             retval = RETURN_OK;
  145.             ostr = (argv.name || argv.full) ? argv.file : "1";
  146.         } else {
  147.             ostr = (argv.name || argv.full) ? "" : "0";
  148.         } /* if */
  149. #else
  150.  
  151.         struct AnchorPath  *ap;
  152.         UBYTE  apb[sizeof (*ap) + 8 + MATHPATHLEN];
  153.         ap          = (void *)(((ULONG)apb + 7) & ~7);
  154.         ap->ap_Strlen      = MAXPATHLEN;
  155.         ap->ap_BreakBits  = 0;
  156.         ap->ap_FoundBreak = 0;
  157.         ap->ap_Flags      = 0;
  158.         error = MatchFirst(argv.file, ap);
  159.         MathEnd (ap);
  160.         if (!error) {
  161.             retval = RETURN_OK;
  162.             ostr = (argv.full) ? ap->ap_Buf :
  163.                      (argv.name) ? argv.file : "1";
  164.         } else {
  165.             ostr = (argv.name || argv.full) ? "" : "0";
  166.         } /* if */
  167.  
  168. #endif
  169.  
  170.         /* ----- Result output, either boolean(0/1) or named (name/"") */
  171.         PutStr( ostr );
  172.         PutStr( "\n" );
  173.         }
  174.  
  175.         if (p != NULL) {
  176.         p->pr_WindowPtr = pw;
  177.         } /* if */
  178.  
  179. /* ******************** USER BODY ******************** */
  180.         FreeArgs (args);
  181.     } /* if */
  182.  
  183.     if (retval > RETURN_WARN)
  184.         PrintFault(IoErr(), "Exists");
  185.  
  186.     CloseLibrary (DOSBase);
  187.     } /* if */
  188.     return (retval);
  189. } /* _main */
  190.  
  191. /******************************************************************************
  192. *****  END Exists.c
  193. ******************************************************************************/
  194.  
  195.